package internet_project.Server;

import internet_project.Manage.User_Enum;
import internet_project.Manage.manage_InputSocket_Thread_Utility;
import internet_project.common.Message;
import internet_project.common.MessageType;
import internet_project.common.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.*;
import java.util.Enumeration;

public class Server {
  // 方便别的地方能用到
  Socket socket;
  User user;

  //！！！！ 第一次建立 连接 就相当于 打 通 Socket 的 管道 连接
  public Server() {
    ServerSocket serverSocket = null;
    try {
      serverSocket = new ServerSocket(8888);
      System.out.println("服务启动...... 在本机网络(IP:" + getLocalIPv4Address() + ")端口号:8888监听");
      while (true) {
        socket = serverSocket.accept(); // 一直等待连接 ，一有socket连接来就返回一个socket
        ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
        user = (User) ois.readObject(); // 第一次接收的一定是user对象

        // 得到用户名和密码
        String userid = user.getUserid();
        String password = user.getPasswd();

        //
        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
        Message message = new Message();

        // 判断是否合法
        if (User_Enum.check_uesr(userid, password)) {//合法用户
          message.setType(MessageType.Login_ok);
          oos.writeObject(message);// 回发客户端
          // ！！！  ok  建立通信 -- 建立 一直保持的通信就行了
          Connect_Client_Socket_Thread connect_client_socket_thread = new Connect_Client_Socket_Thread(userid, socket);
          connect_client_socket_thread.start();

          // 放到 集合里 方便 以后 的 管理
          manage_InputSocket_Thread_Utility.add_Connect_Client_Socket_Thread(userid, connect_client_socket_thread);

        } else {
          message.setType(MessageType.Login_notok);
          oos.writeObject(message);// 回发客户端
          socket.close(); //关闭和客户端连接的socket --》因为连接不合法
          System.out.println("服务端与用户" + userid + "建立连接失败！！！");
        }

      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      // 退出while循环 说明 服务器停止监听
      try {
        serverSocket.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }


//     工具方法获取 wifi的 ipv4 地址方法 和上面的 网络代码无关， 不用看了，只是获取 wifi的 ipv4 地址

  /**
   * 获取本机的IPv4地址（优先获取Wi-Fi或有线网络的IP）
   *
   * @return 本地IPv4地址字符串，如果没有找到则返回 null
   */
  public static String getLocalIPv4Address() {
    try {
      Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
      while (networkInterfaces.hasMoreElements()) {
        NetworkInterface networkInterface = networkInterfaces.nextElement();

        // 跳过回环接口、虚拟接口、关闭的接口
        if (networkInterface.isLoopback() || !networkInterface.isUp()) {
          continue;
        }

        Enumeration<InetAddress> inetAddresses = networkInterface.getInetAddresses();
        while (inetAddresses.hasMoreElements()) {
          InetAddress inetAddress = inetAddresses.nextElement();

          // 只关注IPv4地址，并跳过本地链接地址（如169.254.x.x）
          if (inetAddress instanceof java.net.Inet4Address && !inetAddress.isLinkLocalAddress()) {
            return inetAddress.getHostAddress();
          }
        }
      }
    } catch (SocketException e) {
      e.printStackTrace();
    }
    return null;
  }



  public static void main(String[] args) {
    new Server();
  }
}
